package com.liwalo.action;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.liwalo.dao.AtributoDAO;
import com.liwalo.dao.ListadoCiudadDAO;
import com.liwalo.dao.ListadoProvDAO;
import com.liwalo.dao.MediosContactoDAO;
import com.liwalo.dao.ProductoDAO;
import com.liwalo.dao.TipoViaDAO;
import com.liwalo.dao.ValorDAO;
import com.liwalo.entities.Atributo;
import com.liwalo.entities.ListadoCiudad;
import com.liwalo.entities.ListadoProv;
import com.liwalo.entities.MediosContacto;
import com.liwalo.entities.Producto;
import com.liwalo.entities.ProductosPedido;
import com.liwalo.entities.TipoVia;
import com.liwalo.entities.Usuario;
import com.liwalo.entities.Valor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class PagoSeleccion extends ActionSupport implements SessionAware {

	/**
	 * 
	 */
	private static final long serialVersionUID = -3008125966278810692L;
	
	//IMPORTANTE Obtener de algun sitio el gasto de envio
	private static final double GASTO_ENVIO=7;
	private static String ANONIMO = "anonimo";
	
	private List<ProductosPedido> listadocarrito;
	private List<ListadoCiudad> listadociudad;
	private List<ListadoProv> listadoprov;
	private List<TipoVia> listatipovia;
	private double totalprecio;
	private double totalprecioiva;
	private Usuario usuariovo;
    private MediosContacto medioscvo;
	private int producto_Id;
	private int atributoid;
	private int valorid;
	private int unidades;
	private int provincia;
	private Map <String, Object> session;
	
	public String execute() throws Exception {
		
		MediosContactoDAO mediosDao=new MediosContactoDAO();
		ListadoCiudadDAO listadocdDao =new ListadoCiudadDAO();
		TipoViaDAO tipoviaDao=new TipoViaDAO();
		ListadoProvDAO listadoprovDao=new ListadoProvDAO();
		
		//Obtenemos y verificamos de la sesison si el Usuario es NULL
		usuariovo=(Usuario) session.get("usuario");
		 if((usuariovo==null)){
			 setListadocarrito((List<ProductosPedido>) session.get("listadocarrito"));
		        session.put("listadocarrito", listadocarrito);
		        return ANONIMO;
		       
		 }
		
		 //Obtenemos el lista del Carrito , verificamos que no venga NULL o VAcio
		 //Y obtenemos el total del precio
		setListadocarrito((List<ProductosPedido>) session.get("listadocarrito"));
		
		if(getListadocarrito()!= null || !getListadocarrito().isEmpty()){
			Iterator<ProductosPedido> iterador = listadocarrito.listIterator(); 
			setTotalprecio(0);
			while( iterador.hasNext() ) {
				ProductosPedido pro = (ProductosPedido) iterador.next(); 
				totalprecio+=(pro.getUnidades()*pro.getPrecioUnidad());
			}
		}
		
		usuariovo=(Usuario) session.get("usuario");
		
		//Si el Usuario no es invitado , obtenemos sus datos  para pintar 
		//Provincias y Ciudades
		if( !("Invitado").equals(usuariovo.getNombre()) && usuariovo.getNombre()!=null){
			setMedioscvo(mediosDao.findById(usuariovo));
			ListadoProv prov=new ListadoProv();
			if(null==getMedioscvo()){
				listadociudad=listadocdDao.findAllListadoCiudad();
			}else{
				prov.setId(getMedioscvo().getListadoProvId().getId());
				listadociudad=listadocdDao.findbyProvincia(prov);
				 
			}
			
		 }else{
			 listadociudad=listadocdDao.findAllListadoCiudad();
		 }
		//Agregamos A cada uno de los listados 
		setListadoprov(listadoprovDao.findAllListadoProv());
		setListatipovia(tipoviaDao.findAllTipoVia());
		
		//IMPORTANTE : De donde obtener gastos de envio e IVA
		totalprecioiva=totalprecio+GASTO_ENVIO+5;
		
		return SUCCESS;
	}

	public String compraDirecta() throws Exception {
		MediosContactoDAO mediosDao=new MediosContactoDAO();
		ListadoCiudadDAO listadocdDao =new ListadoCiudadDAO();
		TipoViaDAO tipoviaDao=new TipoViaDAO();
		ListadoProvDAO listadoprovDao=new ListadoProvDAO();
		ProductoDAO productoDao=new ProductoDAO();
		AtributoDAO atributoDao=new AtributoDAO();
		ValorDAO valorDao=new ValorDAO();
					
		Producto productovo=new Producto();
		ProductosPedido prodpedidovo = new ProductosPedido();
		Atributo atributovo = new Atributo();
		Valor valorvo=new Valor();
		
		//Obtenemos y verificamos de la sesison si el Usuario es NULL
		//O no esta registrado
		usuariovo=(Usuario) session.get("usuario");
		if((session==null || session.isEmpty()) || (usuariovo==null)){

			//Creamos una lista de carrito nueva para agregar el producto por si quiere agregar otro
			listadocarrito=new ArrayList<ProductosPedido>();
		       
			//Obtenemos el Producto , Atributo y Valor
		    productovo= productoDao.findById(producto_Id);
			atributovo=atributoDao.findById(atributoid);
			valorvo= valorDao.findById(valorid);
			
			//Agregamos los datos al Objeto de Carrito
			prodpedidovo.setId(productovo.getId());
			prodpedidovo.setProductoId(productovo);
			prodpedidovo.setAtributoId(atributovo);
			prodpedidovo.setValorId(valorvo);
			prodpedidovo.setUnidades(unidades);
			prodpedidovo.setPrecioUnidad(productovo.getPrecio());
			prodpedidovo.setPreciototal((productovo.getPrecio() * unidades));
		
			//Agregamos al listado dle carrito
			listadocarrito.add(prodpedidovo);
			
			//agregamos a session
		    session.put("listadocarrito", listadocarrito);
			  
		    //Regresamos como Usuario ANONIMO
		    return ANONIMO;
		}else{
					 
			 listadocarrito=(List<ProductosPedido>) session.get("listadocarrito");
		}
		//Si el Usuario no es invitado , obtenemos sus datos  para pintar 
				//Provincias y Ciudades
		usuariovo=(Usuario) session.get("usuario");
		if(!("Invitado").equals(usuariovo.getNombre()) && usuariovo.getNombre()!=null){
			setMedioscvo(mediosDao.findById(usuariovo));
			ListadoProv prov=new ListadoProv();
			if(null==getMedioscvo()){
				listadociudad=listadocdDao.findAllListadoCiudad();
			}else{
				prov.setId(getMedioscvo().getListadoProvId().getId());
				listadociudad=listadocdDao.findbyProvincia(prov);
				 
			}
		}
			 
		setListadoprov(listadoprovDao.findAllListadoProv());
		setListatipovia(tipoviaDao.findAllTipoVia());	
		//Obtenemos el Producto , Atributi y Valor
		
		productovo= productoDao.findById(producto_Id);
		atributovo=atributoDao.findById(atributoid);
		valorvo= valorDao.findById(valorid);
		listadociudad = new ArrayList<ListadoCiudad>();
				
		listadociudad=listadocdDao.findAllListadoCiudad();
		//Agregamos los datos al Objeto de Carrito	
		prodpedidovo.setId(productovo.getId());
		prodpedidovo.setProductoId(productovo);
		prodpedidovo.setAtributoId(atributovo);
		prodpedidovo.setValorId(valorvo);
		prodpedidovo.setUnidades(unidades);
		prodpedidovo.setPrecioUnidad(productovo.getPrecio());
		prodpedidovo.setPreciototal((productovo.getPrecio() * unidades));
		listadocarrito.add(prodpedidovo);
			
		//Obtener el total del precio de los productos con unidades
			
		Iterator<ProductosPedido> iterador = listadocarrito.listIterator(); 
		totalprecio=0;
		while( iterador.hasNext() ) {
			ProductosPedido pro = (ProductosPedido) iterador.next(); 
			totalprecio+=pro.getPreciototal();
		}
		
		session.put("listadocarrito", listadocarrito);
			
		usuariovo=(Usuario) session.get("usuario");
		
		//IMPORTANTE : De donde obtener gastos de envio e IVA
		totalprecioiva=totalprecio+GASTO_ENVIO+5;
				
		return SUCCESS;
	}

	
	public String comboCiudad() throws Exception {
		
		ListadoProv prov =new ListadoProv();
		prov.setId(getProvincia());
		listadociudad=new ListadoCiudadDAO().findbyProvincia(prov);
		
		return SUCCESS;
	}
	
	public String comboCiudadf() throws Exception {
		
		ListadoProv prov =new ListadoProv();
		prov.setId(getProvincia());
		listadociudad=new ListadoCiudadDAO().findbyProvincia(prov);
		
		return SUCCESS;
	}

	public List<ProductosPedido> getListadocarrito() {
		return listadocarrito;
	}


	public void setListadocarrito(List<ProductosPedido> listadocarrito) {
		this.listadocarrito = listadocarrito;
	}


	public double getTotalprecio() {
		return totalprecio;
	}


	public void setTotalprecio(double totalprecio) {
		this.totalprecio = totalprecio;
	}


	public int getProducto_Id() {
		return producto_Id;
	}

	public void setProducto_Id(int producto_Id) {
		this.producto_Id = producto_Id;
	}

	public int getAtributoid() {
		return atributoid;
	}

	public void setAtributoid(int atributoid) {
		this.atributoid = atributoid;
	}

	public int getValorid() {
		return valorid;
	}

	public void setValorid(int valorid) {
		this.valorid = valorid;
	}

	public int getUnidades() {
		return unidades;
	}

	public void setUnidades(int unidades) {
		this.unidades = unidades;
	}

	public Usuario getUsuariovo() {
		return usuariovo;
	}


	public void setUsuariovo(Usuario usuariovo) {
		this.usuariovo = usuariovo;
	}


	public double getTotalprecioiva() {
		return totalprecioiva;
	}


	public void setTotalprecioiva(double totalprecioiva) {
		this.totalprecioiva = totalprecioiva;
	}

	public List<ListadoCiudad> getListadociudad() {
		return listadociudad;
	}

	public void setListadociudad(List<ListadoCiudad> listadociudad) {
		this.listadociudad = listadociudad;
	}

	public MediosContacto getMedioscvo() {
		return medioscvo;
	}

	public void setMedioscvo(MediosContacto medioscvo) {
		this.medioscvo = medioscvo;
	}

	public List<ListadoProv> getListadoprov() {
		return listadoprov;
	}

	public void setListadoprov(List<ListadoProv> listadoprov) {
		this.listadoprov = listadoprov;
	}

	public List<TipoVia> getListatipovia() {
		return listatipovia;
	}

	public void setListatipovia(List<TipoVia> listatipovia) {
		this.listatipovia = listatipovia;
	}

	public int getProvincia() {
		return provincia;
	}

	public void setProvincia(int provincia) {
		this.provincia = provincia;
	}

	@Override
	public void setSession(Map<String, Object> session) {
		this.session = session;	
	}
}
